package com.weaving.monitor.service;

import com.weaving.monitor.mapper.WarpingBeamProductMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

/**
 * 梳栉花型查询服务类
 * 
 * 功能说明：
 * 1. 提供通过机器ID和梳栉号查询花型信息的功能
 * 2. 实现复杂的数据库关联查询逻辑
 * 3. 处理查询失败的情况，返回默认值
 * 
 * 注解说明：
 * - @Service: Spring注解，标识这是一个服务类
 * 
 * 方法说明：
 * - getPatternByMachineAndGbNum: 根据机器ID和梳栉号查询花型信息
 * 
 * @author 系统开发团队
 * @version 1.0
 * @since 2024-01-01
 */
@Service
public class PatternService {
    
    @Autowired
    private WarpingBeamProductMapper warpingBeamProductMapper;
    
    /**
     * 根据机器ID和梳栉号查询花型信息
     * 
     * 功能说明：
     * 1. 通过机器ID和梳栉号查询对应的花型信息
     * 2. 实现复杂的关联查询：机器ID+梳栉号->盘头组ID->子盘头编码
     * 3. 处理查询失败的情况，返回默认值
     * 
     * 查询逻辑：
     * 1. 首先通过机器ID和梳栉号查询factory_machine_beamgroup表获取beamgroup_Id
     * 2. 然后通过beamgroup_Id查询warping_beam_product表获取sub_beam_code
     * 3. 按start_time升序排列，取第一条记录
     * 4. 如果任何一步查询失败，返回默认值
     * 
     * 参数说明：
     * - machineId: 机器ID，如"J001"
     * - gbNum: 梳栉号，如1、2、3、4
     * 
     * 返回值说明：
     * - String: 子盘头编码，对应梳栉花型
     * - 如果查询失败或参数为空，返回"--"
     * 
     * 异常处理：
     * - 捕获所有异常，避免影响主业务流程
     * - 记录错误日志，便于问题排查
     * 
     * @param machineId 机器ID，如"J001"
     * @param gbNum 梳栉号，如1、2、3、4
     * @return 子盘头编码，查询失败时返回"--"
     */
    public String getPatternByMachineAndGbNum(String machineId, Integer gbNum) {
        try {
            // 参数校验
            if (machineId == null || machineId.trim().isEmpty() || gbNum == null) {
                return "--";
            }
            
            // 构建机器ID格式（确保格式为J001、J002等）
            String formattedMachineId = formatMachineId(machineId);
            
            // 查询子盘头编码
            String subBeamCode = warpingBeamProductMapper.selectSubBeamCodeByMachineAndGbNum(
                formattedMachineId, gbNum);
            
            // 返回查询结果或默认值
            return (subBeamCode != null && !subBeamCode.trim().isEmpty()) ? subBeamCode.trim() : "--";
            
        } catch (Exception e) {
            // 记录错误日志，但不影响主业务流程
            System.err.println("查询梳栉花型失败，机器ID: " + machineId + ", 梳栉号: " + gbNum + ", 错误: " + e.getMessage());
            return "--";
        }
    }
    
    /**
     * 格式化机器ID
     * 
     * 功能说明：
     * 1. 将机器编号转换为标准的机器ID格式
     * 2. 确保机器ID格式为J开头，三位数字格式
     * 
     * 转换规则：
     * - 如果输入是数字，转换为"J" + 三位数字格式
     * - 如果输入已经是J开头，直接返回
     * - 如果输入为空或无效，返回"J001"
     * 
     * @param machineId 原始机器ID
     * @return 格式化后的机器ID
     */
    private String formatMachineId(String machineId) {
        if (machineId == null || machineId.trim().isEmpty()) {
            return "J001";
        }
        
        String trimmed = machineId.trim();
        
        // 如果已经是J开头，直接返回
        if (trimmed.toUpperCase().startsWith("J")) {
            return trimmed.toUpperCase();
        }
        
        // 尝试解析为数字
        try {
            int machineNumber = Integer.parseInt(trimmed);
            return String.format("J%03d", machineNumber);
        } catch (NumberFormatException e) {
            // 如果无法解析为数字，返回默认值
            return "J001";
        }
    }
} 